package com.jidolstar.astro
{
	/**
	 * 천문계산을 위한 간단한 수학 정적 메서드를 담은 클래스
	 * @author Yongho,Ji (jidolstar@gmail.com)
	 * @since 2009.03.30 
	 */ 	
	public class ALMath
	{
		/**
		 * 실수의 소수점 이하값  얻음 
		 * @param value 실수값 
		 * @return 소수점 이하값
		 * @example 
		 * trace( AstroMath.frac(10.334) ); //0.334 
		 */ 
		static public function frac( value:Number ):Number
		{
			return (value - Math.floor( value ));
		}
		
		/**
		 * 첫번째 인자값을 두번째, 세번째 인자값내에 해당하는 값으로 normalize시킴 
		 * @param value normalize처리할 값 
		 * @param fromValue normailze 시작값. 기본값 0
		 * @param toValue normalize 마지막값. 기본값 2pi
		 * @return 
		 */ 
		static public function mapToRange( value:Number, fromValue:Number = 0, toValue:Number = 6.2831853071795864769252867665590 ):Number
		{
			var w:Number = toValue - fromValue;
			return value - Math.floor( value / w ) * w + fromValue;
		}

		/**
		 * degree값을 0~360 안으로 맵핑함 
		 * 가령 -1인경우 359가 되며 367인 경우 7이 됨 
		 * @param degrees
		 * @return
		 */ 
		static public function mapTo0To360Range( degrees:Number ):Number
		{
			return degrees - Math.floor( degrees / 360 ) * 360;			
		}
		
		/**
		 * hour값을 0~24 안으로 맵핑함 
		 * 가령 -1인경우 23이 되며 25인 경우 1이 됨. 3인 경우는 그대로 3  
		 * @param degrees
		 * @return
		 */ 
		static public function mapTo0To24Range( hourAngle:Number ):Number
		{
			return hourAngle - Math.floor( hourAngle / 24 ) * 24;			
		}
		
		/**
		 * radian값을 0~2*pi 안으로 맵핑함 
		 * @param radian
		 * @return
		 */ 
		static public function mapTo0To2PIRange( radian:Number ):Number
		{
			return radian - Math.floor( radian / 6.2831853071795864769252867665590 ) * 6.2831853071795864769252867665590;			
		}	
		
		/**
		 * degrees값을 -90~90안으로 맵핑함 
		 * 이 경우 -90이하, 90이상의 값을 없다고 본다.
		 * @param degrees
		 * @return
		 */ 
		static public function mapToMinus90To90Range( degrees:Number ):Number
		{
			if( degrees > 90 ) degrees = 90;
			else if( degrees < -90 ) degrees = -90;
			return degrees;
		}			
		
	}
}